package com.up.stores.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.up.stores.entity.Cart;
import com.up.stores.entity.Product;
import com.up.stores.mapper.CartMapper;
import com.up.stores.mapper.ProductMapper;
import com.up.stores.service.ICartService;
import com.up.stores.service.ex.CartNotFoundException;
import com.up.stores.service.ex.DeleteException;
import com.up.stores.service.ex.InsertException;
import com.up.stores.vo.CartVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;

/** 处理购物车数据的业务层实现类 */
@Service
public class CartServiceImpl implements ICartService {
    @Autowired
    private CartMapper cartMapper;
    @Autowired
    private ProductMapper productMapper;

    @Override
    public void addCart(Integer uid, String type, Integer proId, Integer amount, String username) {
        // 根据参数proId和uid查询购物车中的数据
        QueryWrapper<Cart> queryWrapper = new QueryWrapper<>();
        if(type.equals("Admin")){
            queryWrapper.eq("adm_id", uid).eq("pro_id", proId);
        }else{
            queryWrapper.eq("nor_id", uid).eq("pro_id", proId);
        }
        Cart result = cartMapper.selectOne(queryWrapper);
        Date date = new Date();
        // 判断查询结果是否为null
        //若某个物品已经加入该用户的购物车，则再在商品界面点击加入购物车的操作相当于将该商品的数量amount增加
        if (result == null) {
            // 是：表示该用户并未将该商品添加到购物车
            // 创建Cart对象
            Cart cart = new Cart();
            // 封装数据：uid,pid,amount
            if(type.equals("Admin")) {cart.setAdmId(uid);}else{cart.setNorId(uid);}
            cart.setProId(proId);
            cart.setNum(amount);
            //查找商品价格并封装
            QueryWrapper<Product> queryWrapper1 = new QueryWrapper<>();
            queryWrapper1.eq("pro_id", proId);
            Product product = productMapper.selectOne(queryWrapper1);
            cart.setPrice(product.getPrice());
            // 封装数据：4个日志
            cart.setCreatedUser(username);
            cart.setCreatedTime(date);
            cart.setModifiedUser(username);
            cart.setModifiedTime(date);
            // 调用insert(cart)执行将数据插入到数据表中
            Integer rows = cartMapper.insert(cart);
            if (rows != 1) {
                throw new InsertException("插入商品数据时出现未知错误，请联系系统管理员");
            }
        } else {
            //将该条购物车记录的num值更新
            Integer cartId = result.getCartId();
            Cart cart = new Cart();
            cart.setNum(result.getNum() + amount);
            QueryWrapper<Cart> queryWrapper2 = new QueryWrapper<>();
            queryWrapper2.eq("cart_id", cartId);
            Integer rows = cartMapper.update(cart, queryWrapper2);
            if (rows != 1){
                throw new InsertException("更新数据时产生未知异常");
            }
        }
    }

    @Override
    public void deleteCart(Integer cartId) {
        QueryWrapper<Cart> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("cart_id", cartId);
        Integer rows = cartMapper.delete(queryWrapper);
        if (rows != 1) {
            throw new DeleteException("删除时出现未知错误");
        }
    }

    @Override
    public List<CartVO> getVOByUidAndType(Integer uid, String type) {
        if(type.equals("Admin")){
            return cartMapper.findVOByAdmId(uid);
        }else{
            return cartMapper.findVOByNorId(uid);
        }
    }

    @Override
    public Integer addNum(Integer cartId, String username) {
        // 根据参数cid查询购物车数据
        QueryWrapper<Cart> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("cart_id", cartId);
        Cart result = cartMapper.selectOne(queryWrapper);
        // 判断查询结果是否为null
        if (result == null) {
            // 是：抛出CartNotFoundException
            throw new CartNotFoundException("尝试访问的购物车数据不存在");
        }
        // 可选：检查商品的数量是否大于多少(适用于增加数量)或小于多少(适用于减少数量)
        // 根据查询结果中的原数量增加1得到新的数量num
        Integer num = result.getNum() + 1;
        // 创建当前时间对象，作为modifiedTime
        Date now = new Date();
        // 修改数量
        Cart cart = new Cart();
        cart.setNum(num);
        cart.setModifiedTime(now);
        cart.setModifiedUser(username);
        Integer rows = cartMapper.update(cart, queryWrapper);
        if (rows != 1) {
            throw new InsertException("修改商品数量时出现未知错误，请联系系统管理员");
        }
        // 返回新的数量
        return num;
    }

    @Override
    public Integer reduceNum(Integer cartId, String username) {
        // 根据参数cid查询购物车数据
        QueryWrapper<Cart> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("cart_id", cartId);
        Cart result = cartMapper.selectOne(queryWrapper);
        // 判断查询结果是否为null
        if (result == null) {
            // 是：抛出CartNotFoundException
            throw new CartNotFoundException("尝试访问的购物车数据不存在");
        }
        // 可选：检查商品的数量是否大于多少(适用于增加数量)或小于多少(适用于减少数量)
        // 根据查询结果中的原数量增加1得到新的数量num
        Integer num = result.getNum() - 1;
        //判断减少后数量是否为0
        if(num==0){
            //如果数量减1后为0，则进行移出购物车操作
            Integer rows = cartMapper.delete(queryWrapper);
            if (rows != 1) {
                throw new DeleteException("删除时出现未知错误");
            }
        }else{
            // 创建当前时间对象，作为modifiedTime
            Date now = new Date();
            // 修改数量
            Cart cart = new Cart();
            cart.setNum(num);
            cart.setModifiedTime(now);
            cart.setModifiedUser(username);
            Integer rows = cartMapper.update(cart, queryWrapper);
            if (rows != 1) {
                throw new InsertException("修改商品数量时出现未知错误，请联系系统管理员");
            }
        }
        return num;
    }

    @Override
    public List<CartVO> getVOByCartIds(Integer[] cartIds) {
        List<CartVO> list = cartMapper.findVOByCartIds(cartIds);
        //异常判断
        /*
          Iterator<CartVO> it = list.iterator();
          while (it.hasNext()) {
            CartVO cart = it.next();
            if (!cart.getUid().equals(uid)) {
                it.remove();
            }
        }*/
        return list;
    }
}